perm filename SCANR.F4[Y,MUS] blob
sn#065169 filedate 1973-12-01 generic text, type T, neo UTF8
00010 C SUBRS. SCANR, NALF, EDIT
00020
00100 C ***** MSS SCANNER *************************
00200 SUBROUTINE SCANR
00300 DIMENSION IQ(10),LRUD(4)
00400 COMMON/ALF/INP(72),ML
00500 COMMON /SC/J,L,MK
00600 1 ,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JN,DBST,NFLG,IXX,ISEMI,QQ
00700 1 ,VX(50),IAMP,K,KN,M,MODE,IBLA
00800 EQUIVALENCE (IQ(1),VX(41)),(VX1,VX(1)),(VX2,VX(2))
00810 DATA IBLA/' '/,LRUD/'L','R','U','D'/
01000 C FOR LEFT, RIGHT, UP, DOWN, EDIT
01100 NNUM=-1
01200 ISKP=0
01300 JJ=0
01400 XMINUS=1.
01500 C LEAVES BLANK WHEN REST.
01600 999 IDECI=-1
01700 M=0
01800 2799 N=INP(ML)
01900 899 ML=ML+1
01910 781 IF(N.EQ.'/')N=ISEMI
01955 C FOR MOTIVIC TRANFORMATIONS
02000 IF(N.EQ.ISEMI.OR.N.EQ.'*')GO TO 751
02050 C '*' AND '/' ADDED ABOVE 4/18/73
02100 IF(N.NE.IBLA.AND.N.NE.',')GO TO 510
02200 4702 IF(ISKP)202,2799,2799
02300 512 ML=ML+1
02400 IF(INP(ML).EQ.ISEMI)RETURN
02500 GO TO 512
02600
02700 510 IF(JN.GE.0)GO TO 173
02710 C SKIP(JN=+1) IF NOT COMING FROM 'EDIT'
02800 JN=1
02900 DO 702 K=1,4
03000 702 IF(N.EQ.LRUD(K))GO TO 703
03100 C FINDS L, R, U, D
03200 C YOU CAN TYPE THE FULL WORD
03300 703 JJ=JJ+1
03400 IF(K.EQ.4.AND.INP(ML).EQ.'E')K=99
03500 C 'DE'=DELETE
03600 IF(N.EQ.'E')K=55
03650 C 'E'= EDIT
03675 IF(N.EQ.'C')K=2222
03687 IF(N.EQ.'X')K=222
03693 C 'C'=COPY, 'X'=EXIT FROM EDIT MODE
03700 VX(JJ)=K
03800 704 IF(INP(ML).EQ.IBLA.OR.INP(ML).EQ.',')GO TO 2799
03850 C PUT COMMA ERASER IN SCX.
03900 ML=ML+1
04000 C SO IT WILL SKIP 'D' AND 'EL' IN 'EDIT' AND 'DEL'
04100 GO TO 704
04110 17 IF(N.NE.'+')GO TO 172
04120 NOLD=NOLD+6
04130 GO TO 7410
04140 172 IF(N.NE.'-')GO TO 173
04150 NOLD=NOLD-6
04160 C FOR + OF - IN PROXIMITY MODE.
04170 GO TO 7410
04200 173 K=NALF(N)
04300 IF(N.GT.0)GO TO 1410
04400 C JUMP IF NOT A LETTER
04500 QQ=0
04600 IF(K.LT.8)GO TO 15
04700 C JUMP IF A POSSIBLE NOTE
04800 IF(K.NE.11)GO TO 16
04900 C JUMP IF NOT A KSIG
05000 18 N=INP(ML)
05100 ML=ML+1
05200 IF(N.EQ.IBLA.OR.N.EQ.'S'.OR.N.EQ.'+')GO TO 18
05300 IF(N.EQ.ISEMI)GO TO 20
05400 IF(N.NE.'-'.AND.N.NE.'F')GO TO 19
05500 QQ=-10000.
05600 GO TO 18
05700 19 A=NALF(N)
05800 GO TO 18
05900 20 VX(1)=-A*1000.-99.+QQ
06000 C -4099=4 SHARPS, -14099=4 FLATS, ETC.
06100 RETURN
06200 16 IF(K.NE.9)GO TO 2
06300 VX(1)=22.
06400 C FOR EDIT I21 ETC.
06500 GO TO 2799
06600 2 IF(K.NE.13)GO TO 3
06700 C JUMP IF NOT A MEASURE LINE
06800 VX(1)=-599.
06850 K=NALF(INP(ML))
06860 IF(K.GT.0.AND.K.LE.9)VX(1)=-599.-K
06870 C 'M2'= A BAR LINE UP 2 STAVES. ETC.
06900 GO TO 512
07000 3 IF(K.GT.16)GO TO 4
07100 C JUMP IF NOT FOR 'PROXIMITY' MODE
07200 NSWCH=K-15
07300 GO TO 2799
07400 C TO SWITCH ALWAYS USE OCT.# /PBF4/ /OE5/ P=PROXIMITY, O=ORDINARY
07500 4 IF(K.EQ.18)GO TO 73
07600 C JUMP IF A REST
07700 IF(K.EQ.24)GO TO 210
07800 C JUMP IF IT'S AN X
07900 IF(K.NE.20)GO TO 899
08000 C TRY AGAIN IF NOT A 'T'
08100 VX(1)=-199.
08200 IF(INP(ML).EQ.'E')VX(1)=-499.
08300 GO TO 512
08400 C NEXT IT'S A NOTE OR CLEF
08500 CC NFLG=-1
08600 15 NNUM=K-2
08700 IF(NNUM.LE.0)NNUM=NNUM+7
08800 N=INP(ML)
08900 IF(N.NE.'A')GO TO 5
09000 C JUMP IF NOT BASS CLEF
09100 VX(1)=-299.
09200 GO TO 512
09300 5 IF(N.NE.'L')GO TO 6
09400 C JUMP IF NOT ALTO CLEF
09500 VX(1)=-399.
09600 GO TO 512
09700 CC6 NNUM=K-2
09800 CC IF(NNUM.LE.0)NNUM=K+5
09900 6 K=1
10000 IF(NNUM.GT.3)K=2
10100 NNUM=NNUM+NNUM-K
10200 C FOUND A NOTE
10300
10400 K=NALF(N)
10500 IF(N.GT.0)GO TO 7
10600 C JUMP IF NOT A LETTER
10700 QQ=10000.
10800 IF(K.EQ.14)GO TO 610
10900 IF(K.EQ.19)GO TO 8
11000 C JUMP IF NATURAL
11100 QQ=100.
11200 NNUM=NNUM-1
11300 GO TO 610
11400 8 QQ=1000.
11500 NNUM=NNUM+1
11600 610 ML=ML+1
11700 K=NALF(INP(ML))
11800 7 IF(K.EQ.11.OR.K.LT.0)GO TO 5410
11900 C JUMP IF SEMICOLON OR BLANK
12000 JSCA=K-1
12100 ML=ML+1
12200 KN=0
12300 GO TO 2410
12400 5410 KN=-1
12500 6410 IF(NSWCH.EQ.0)GO TO 2410
12550 C K=-16 IS A BLANK??
12600 CC IF(K.LT.0.AND.K.NE.-16)NOLD=NOLD-6*(K+4)
12610 IF(K.NE.-3.AND.K.NE.-5)GO TO 7410
12620 NOLD=NOLD-6*(K+4)
12630 ML=ML+1
12700 C -=-3 +=-5 /B/B-/ JUMPS DOWN OCT., /B/B+/ UP OCT.
12800 7410 IF(NOLD-NNUM.GT.5.AND.JSCA.LT.7)JSCA=JSCA+1
12900 IF(NOLD-NNUM.LT.-5.AND.JSCA.GT.0)JSCA=JSCA-1
13000 C WILL JUMP TO NEAREST NOTE *********** MAY 22,71
13100 2410 JJ=1
13150 VX2=0
13200 VX1=(JSCA*12+NNUM+QQ)*DBST
13300 C DOUBLE STOPS ARE NEG. NUMBERS
13400 NOLD=NNUM
13500 4410 NNUM=-2
13600 IF(INP(ML).EQ.ISEMI)RETURN
13700 C ABOVE FINDS SCALE NOTES; IF NSWCH=0 OCT. NUM WILL STICK UNTIL RESET
13800 GO TO 310
13900 210 JJ=JJ+1
14000 IF(JJ.EQ.1)GO TO 3310
14100 XMINUS=1.
14200 VX(JJ)=0
14300 C 'X N1,N2' MAY REPLACE 'REP N1,N2'. N2=0 BECOMES N2=2
14400 GO TO 310
14500
14600 CC1410 IF(N.LT.0)GO TO 781
14700 C JUMP IF A LETTER
14800 1410 IF(N.NE.'-')GO TO 14
14900 XMINUS=-1.
15000 GO TO 2799
15100 14 ISKP=-1
15200 IF(N.NE.'.')GO TO 79
15300 IDECI=M
15400 GO TO 75
15500 79 M=M+1
15600 IQ(M)=NALF(N)
16000
16100 75 IF(N.NE.ISEMI.AND.INP(ML).NE.1)GO TO 2799
16200 751 IF(ISKP.EQ.0)RETURN
16300 202 IF(IDECI.NE.-1)GO TO 302
16400 IDECI=0
16500 GO TO 402
16600 302 IDECI=M-IDECI
16700 402 KN=0
16800 IEXP=M-1
16900 IF(M.LT.1)M=1
17000 DO 171 K=1,M
17010 IF(IEXP.GT.1)GO TO 1
17020 KV=10
17030 IF(IEXP.EQ.0)KV=1
17040 GO TO 11
17100 1 KV=10**IEXP
17200 CC IF(IEXP.EQ.0)KV=1
17300 11 KN=KN+IQ(K)*KV
17400 171 IEXP=IEXP-1
17500 A=10**IDECI
17600 IF(IDECI.EQ.0)A=1.
17700 JJ=JJ+1
17800 VX(JJ)=KN/A*XMINUS
17900 JN=-JN
18000 C SETS IT TO -1 FOR L,R,U,D EDIT ROUTINE
18100 IF(MODE.NE.2)XMINUS=1.
18200 C************: MODE #?
18300 C ONLY ONE - NEEDED FOR RHY.COMPOSITE
18400 1310 IF(INP(ML).NE.1)GO TO 310
18500 VX(JJ+1)=VX(JJ)*2.
18600 JJ=JJ+1
18700 ML=ML+1
18800 GO TO 1310
18900 206 ML=ML+2
19000 3310 VX(1)=-99.
19100 310 ISKP=0
19200 IF(N.NE.ISEMI)GO TO 999
19300
19400 RETURN
19500 73 JJ=JJ+1
19600 IF(INP(ML).EQ.'E')GO TO 206
19700 C NEXT IS FOR A REST ('R')
19800 VX(JJ)=85.
19900 GO TO 4410
20000 END
20100
20200
20300
20400 FUNCTION NALF(I)
20500 J='A'
20600 M=-1
20700 IF(I.LT.0)GO TO 10
20800 J=' '
20900 C SEE FORTRAN MAN. FOR VALUES OF NON-NUMS.
21000 M=16
21100 C IF I IS '0', NALF WILL BE 0, 'A'=1
21200 10 NALF=(I-J)/536870912-M
21400 END
21500
21600
21700 SUBROUTINE EDIT(JJA,RJJB)
21800 COMMON/ALF/INP(72),ML
21900 COMMON /SC/JL,LJ,MK
22000 1 ,ISKP,XMINUS,N,IEXP,LK,NNUM,JM,JN,DBST,NFLG,IXX,ISEMI,QQ
22100 1 ,RVX(50),IAMP,A,KN,B,MODE,IBLA
22200 COMMON RJB,JA,CENTR,JB,RJQ(20),JQ(20)
22300 COMMON/RRJJ/RJJ(20)
22500 EQUIVALENCE (RVX1,RVX(1)),(RVX2,RVX(2)),(RVX4,RVX(4))
22600 1,(RJJ2,RJJ(2)),(RVX3,RVX(3))
22700 JN=-1
22800 C THIS IS FLAG IN SCANR
22900 INP(20)=ISEMI
23000 ML=1
23100 RVX2=0
23200 RVX4=0
23250 C E=EDIT(55), C=COPY(2222), X=EXIT(222), DE=DEL(99), L=LTPN
23300 CALL SCANR
23400 JN=0
23450 RJB=RVX2
23500 IF(RVX1.LT.10.)GO TO 7
23600 JA=RVX1
23750 IF(JA.EQ.99)RJB=0
23800 IF(RJB.NE.0.OR.JA.NE.55)RETURN
24400 5 CALL LPEN(RJQ(1),RJB,K)
24500 C CURSOR WILL FIND HORIZ. POSITION FOR 55 EDIT.
24610 RVX1=2.
24620 RVX2=RJB-RJJB
24630 RVX3=3.
24730 RJQ(2)=0
24740 RJJ(1)=RJQ(1)
24752 C ↑↑↑↑↑↑↑↑↑↑↑↑?????????
24765 C SO JD WILL BE 0 IN MAIN PROG.
24782 GO TO 8
24800 C FOR EDIT MODE
24805 7 JA=0
24810 IF(RVX2.NE.0)GO TO 8
24812 IF(RVX1.NE.4)GO TO 5
24814 CC JA=99.
24816 RETURN
24820 C FOR LIGHT PEN MOVING
24850 8 IF(JA.EQ.55)RETURN
24900 RJB=.00001
25000 JA=0
25400 K=RVX1
25600 857 GO TO (1,2,3,4,2),K
25700 4 RVX2=-RVX2
25800 CC3 IF(JJA.EQ.3.OR.JJA.EQ.7.OR.JJA.EQ.10.OR.JJA.EQ.18)GO TO 12
25810 3 IF(JJA.EQ.7.OR.JJA.EQ.10.OR.JJA.EQ.18)GO TO 12
25855 C SKIP OVER CLEFS (JJA=3) IS NOW REMOVED. 6/73
25900 RJJ2=RJJ2+RVX2
26000 C MOVES UP OR DOWN
26100 IF(JJA.NE.4.AND.JJA.NE.8.AND.JJA.NE.9)GO TO 856
26360 C I THINK RJB MUST BE NON-ZERO TO WORK IN EDIT MODE?
26370 12 IF(RJJ(3).EQ.50)GO TO 856
26375 C 50=CRESC.-DECRESC.
26400 K=3
26500 IF(JJA.EQ.7.OR.JJA.EQ.18)K=4
26600 RJJ(K)=RJJ(K)+RVX2
26700 C MOVES 2ND PARVX2M UP OR DOWN
26800 GO TO 856
26900 1 RVX2=-RVX2
27000 2 RJB=RVX2
27010 856 IF(RVX4.EQ.0)GO TO 858
27020 K=RVX3
27030 RVX2=RVX4
27040 RVX4=0
27050 GO TO 857
27060 858 IF(RJB.EQ..00001)GO TO 7515
27100 IF(JJA.EQ.20.OR.JJA.EQ.9.OR.JJA.EQ.8)GO TO 5515
27110 IF(JJA.NE.4.OR.RJJ(4).EQ.0)GO TO 7515
27120 C ABOVE FOR P1=9 (BEAMS, SLURS, LINES)
27130 5515 RJJ(4)=RJJ(4)+RJB
27150 IF(RJJ(7).NE.0)RJJ(7)=RJJ(7)+RJB
27170 C RJJ(7) IS LOC. OF INNER NOTE IN BEAM RANGE.
27180 7515 RJB=RJB+RJJB
27300 END